package com.example.demo.utils;


import com.example.demo.config.KeyConfig;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

import java.nio.charset.StandardCharsets;
import java.util.Map;

public class MyHandsshakeInterceptor extends HttpSessionHandshakeInterceptor {

    private final TokenUtils tokenUtils;

    public MyHandsshakeInterceptor(TokenUtils tokenUtils) {
        this.tokenUtils = tokenUtils;
    }

    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler,
                                   Map<String, Object> attributes) throws Exception {
//        在请求的url参数中获取token
        String token = extractTokenFromUri(request.getURI());
        if (token != null) {
//            验证token是否有效（没过期）
            if (isValidToken(token)) {
                // 将 Token 存储到 WebSocketSession 的属性中（token有效没过期）
                attributes.put("token", token);
                return super.beforeHandshake(request, response, webSocketHandler, attributes);
            } else {
                // 如果 Token 无效或过期，返回 false，阻止握手过程
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                response.getHeaders().add("Content-Type", "application/json;charset=UFT-8");
                response.getBody().write("{\"error\":\"Invalid or expired token\"}".getBytes(StandardCharsets.UTF_8));  // 返回错误信息
                return false;
            }
        } else {
            // 如果 Token 缺失，返回 false，阻止握手过程
            response.setStatusCode(HttpStatus.BAD_REQUEST); // 设置状态码为 400
            response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
            response.getBody().write("{\"error\":\"Token is missing\"}".getBytes(StandardCharsets.UTF_8)); // 返回错误信息
            return false;
        }
//        return super.beforeHandshake(request, response, webSocketHandler, attributes);
    }

    private String extractTokenFromUri(java.net.URI uri) {
//        获取查询字符串
        String query = uri.getQuery();
        if (query != null) {
//            按照&分割查询字符串
            String[] pairs = query.split("&");
            for (String pair : pairs) {
                // 按照 "=" 分割键值对
                String[] keyValue = pair.split("=");
                if (keyValue.length == 2 && keyValue[0].equals("token")) {
                    // 返回 token 值
                    return keyValue[1];
                }
            }
        }
        return null;
    }

    //    验证token是否过期
    private boolean isValidToken(String token) {
        return tokenUtils.isValidToken(token);
    }



}
